#include "pch.h"
#include "DataProcessor.h"




DataProcessor::DataProcessor()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

DataProcessor::~DataProcessor()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




void DataProcessor::attach(DataReader::Ptr provider)
{
	m_provider = provider;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void DataProcessor::unpause()
{
	// Test if it's time to wake-up:
	// If we're past our wake-up point, then we can start working again
	// (which is controlled by emptying the wake-up time)
	if(sleep() && boost::posix_time::microsec_clock::local_time() >= *m_wakeUp)
		m_wakeUp = boost::optional<ptime>();
}
///////////////////////////////////////////////////////////////////////////////////////////////////




bool DataProcessor::sleep() const
{
	// If we've specified a wake-up time, then we want to sleep
	return m_wakeUp;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

boost::optional<DataProcessor::ptime> DataProcessor::wakeUp() const
{
	return m_wakeUp;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void DataProcessor::process()
{
	if(!sleep())
	{
		Reply::Opt reply = m_provider->next();
		if(reply)
			process(*reply);
		else
			// If the provider can't give us another reply, then
			// we wait for some time and then try again
			sleep(boost::posix_time::milliseconds(500));
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void DataProcessor::sleep(time_duration duration)
{
	m_wakeUp == boost::posix_time::microsec_clock::local_time() + duration;
	pause();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
